package com.sun.module_base.app

import android.app.ActivityManager
import android.app.Application
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelStore
import androidx.lifecycle.ViewModelStoreOwner
import com.sun.module_base.serviceloader.IApplicationInitHandler
import java.util.ServiceLoader

/**
 *@author:sunc
 *@time :2025/7/18 15:31
 *@desc: 描述
 */
abstract class BaseApp : Application(), ViewModelStoreOwner {

    // 延迟初始化的ViewModelStore，用于存储ViewModel实例
    private lateinit var mAppViewModelStore: ViewModelStore

    // ViewModelProvider的工厂类，用于创建ViewModel实例
    private var mFactory: ViewModelProvider.Factory? = null

    // 应用程序初始化处理器列表，用于执行各种初始化操作
    private var sApplicationInitHandlers: MutableList<IApplicationInitHandler> =
        ArrayList<IApplicationInitHandler>()

    // 初始化块，检查Application实例是否为null
    init {
        requireNotNull(this) { "Application is null" }
    }

    // 实现ViewModelStoreOwner接口，返回ViewModelStore实例
    override val viewModelStore: ViewModelStore
        get() = mAppViewModelStore

    // 伴生对象，用于获取全局的BaseApp实例
    companion object {
        lateinit var INSTANCE: BaseApp

        // 获取全局的ApplicationContext
        fun getApplicationContext(): BaseApp = INSTANCE
    }

    // 初始化块，加载所有实现了IApplicationInitHandler接口的处理器
    init {
        ServiceLoader.load(IApplicationInitHandler::class.java).forEach {
            sApplicationInitHandlers.add(it)
        }
    }

    // 重写Application的onCreate方法，进行应用初始化
    override fun onCreate() {
        super.onCreate()
        INSTANCE = this
//        DataStoreUtils.init(this)  // 被注释掉的DataStore初始化代码
        mAppViewModelStore = ViewModelStore()  // 初始化ViewModelStore
        initHandler()  // 执行初始化处理器
    }

    /**
     * 实现接口实例方法
     * 遍历所有初始化处理器并执行其initHandler方法
     */
    private fun initHandler() {
        for (iApplicationInitHandler in sApplicationInitHandlers) {
            iApplicationInitHandler.initHandler(
                this,
                isMainProcess()
            )
        }
    }

    /**
     * 判断当前进程是否为主进程
     * @return Boolean 如果当前进程是主进程则返回true，否则返回false
     * @throws SecurityException 如果没有获取系统服务的权限
     * @throws ClassCastException 如果获取到的服务不是ActivityManager类型
     * @note 该方法通过比较当前应用的包名与运行中的进程名来判断是否为主进程
     * @note 主进程通常是指应用启动时的默认进程，包名与进程名相同
     * @t @r @n
     */
    protected open fun isMainProcess(): Boolean { // 声明一个开放的保护成员函数，用于判断当前进程是否为主进程

        return try { // 尝试执行以下代码块
            val activityManager = getSystemService(ACTIVITY_SERVICE) as? ActivityManager // 获取ActivityManager系统服务，如果转换失败则为null
            val packageName = this.packageName // 获取当前应用的包名
            activityManager?.runningAppProcesses?.any { // 如果activityManager不为null，检查其runningAppProcesses列表
                it.processName == packageName // 检查是否有进程名与包名相同的进程
            } ?: false // 如果activityManager为null或runningAppProcesses为空，返回false
        } catch (e: SecurityException) { // 捕获安全异常
            throw e // 重新抛出安全异常
        } catch (e: Exception) { // 捕获其他异常
            false // 发生异常时返回false
        }

    }

    // 抽象方法，子类必须实现，返回应用ID
    abstract fun getApplicationId(): String

    // 抽象方法，子类必须实现，返回应用版本号
    abstract fun getApplicationVersion(): String

    // 抽象方法，子类必须实现，返回应用版本代码
    abstract fun getApplicationCode(): String

    /**
     * 获取一个全局的viewmodel
     */
    fun getAppViewModelProvider(): ViewModelProvider {
        return ViewModelProvider(this, this.getAppFactory())
    }

    private fun getAppFactory(): ViewModelProvider.Factory {
        if (mFactory == null) {
            mFactory = ViewModelProvider.AndroidViewModelFactory.getInstance(this)
        }
        return mFactory as ViewModelProvider.Factory
    }
}